package com.zhentao.entity.order;

import com.alibaba.excel.EasyExcel;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

/**
 * Excel 导出工具类，封装 EasyExcel 导出逻辑
 */
public class ExcelExportUtil {

    /**
     * 导出数据到 XLSX 文件（用于 Web 场景，直接响应给前端下载）
     *
     * @param response HttpServletResponse 对象，用于构建响应
     * @param data     要导出的数据列表，元素需是带 EasyExcel 注解的实体类
     * @param fileName 导出的文件名（不含后缀，会自动拼接 .xlsx）
     * @param clazz    数据列表元素的 Class 对象，用于解析 Excel 表头
     * @param <T>      数据列表元素的类型
     * @throws IOException 当 IO 操作异常时抛出
     */
    public static <T> void export(HttpServletResponse response, List<T> data, String fileName, Class<T> clazz) throws IOException {
        // 设置响应头，指定内容类型为 Excel 文件
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("UTF-8");

        // 处理文件名编码，避免中文乱码
        String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=UTF-8''" + encodedFileName + ".xlsx");

        // 使用 EasyExcel 写入数据到响应输出流
        EasyExcel.write(response.getOutputStream(), clazz)
                .sheet("数据列表")  // 设置 Excel 工作表名称
                .doWrite(data);    // 执行写入操作
    }

    /**
     * 导出数据到本地 XLSX 文件（用于本地测试或非 Web 场景）
     *
     * @param filePath 本地文件路径，如 "D:/导出数据.xlsx"
     * @param data     要导出的数据列表，元素需是带 EasyExcel 注解的实体类
     * @param clazz    数据列表元素的 Class 对象，用于解析 Excel 表头
     * @param <T>      数据列表元素的类型
     */
    public static <T> void exportToLocal(String filePath, List<T> data, Class<T> clazz) {
        EasyExcel.write(filePath, clazz)
                .sheet("数据列表")  // 设置 Excel 工作表名称
                .doWrite(data);    // 执行写入操作到本地文件
    }
}